﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;

namespace XmlWork
{
    /// <summary>
    /// Класс для работ по чтению/записи настроек в xml.
    /// </summary>
    class WorkWithXML
    {
        /// <summary>
        /// Сохранить в файл
        /// </summary>
        /// <param name="filePath">Имя файла для сохранения</param>
        /// <param name="obj">Класс, реализующий IXmlWorker, из которого происходит вызов данного метода</param>
        public static void SaveToXmlFile(string filePath, IXmlWorker obj)
        {
            FileStream fs = new FileStream(filePath, FileMode.Create);
            XmlTextWriter xmlOut = new XmlTextWriter(fs, Encoding.UTF8);

            xmlOut.Formatting = Formatting.Indented;

            xmlOut.WriteStartDocument();
            xmlOut.WriteComment("Config file for " + obj.ObjectName);
            xmlOut.WriteStartElement("Config");

            obj.SaveToFile(xmlOut);

            xmlOut.WriteEndElement();
            xmlOut.WriteEndDocument();
            xmlOut.Close();
            fs.Close();
        }

        public static void ReadFromXmlFile(string filePath, IXmlWorker obj)
        {
            FileStream fs = new FileStream(filePath, FileMode.Open);
            XmlTextReader xmlIn = new XmlTextReader(fs);
            xmlIn.WhitespaceHandling = WhitespaceHandling.None;
            xmlIn.MoveToContent();

            if (xmlIn.Name != "Config")
                throw new ArgumentException("Incorrect file format.");

            do
            {
                if (!xmlIn.Read())
                    throw new ArgumentException("Error @ read file.");
                if (xmlIn.NodeType == XmlNodeType.EndElement && xmlIn.Name == "Config")
                    break;
                if (xmlIn.NodeType == XmlNodeType.EndElement)
                    continue;

                obj.ReadFromFile(xmlIn);

            }
            while (!xmlIn.EOF);

            xmlIn.Close();
            fs.Close();
        }
    }
}
